/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.gbvbahia.usuarios.modelos;

import br.com.gbvbahia.usuarios.modelos.commons.EntityInterface;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Guilherme
 */
@Entity
@Table(name = "system_group")
@XmlRootElement
public class Sistema implements EntityInterface<Sistema> {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @NotNull
    @Size(min = 5, max = 50)
    @Column(name = "system_id", nullable = false, length = 50)
    private String nome;
    /**
     * Quando um usuário é cadastrado, essa informação define se é para carregar
     * os grupos que forem marcados como default e os mesmos serão incluídos
     * automaticamente no usuário a ser cadastrado.<br> Logicamente que no
     * momento do cadastro esses grupos poderão ser alterados conforme
     * necessidade.<br>
     */
    @Basic(optional = false)
    @Column(name = "group_dafeult", nullable = false)
    private boolean utilizarGrupoPadrao = true;
    /**
     * Cada sistema possui seu conjunto de grupos para mapeamento aos usuários.
     */
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,
    mappedBy = "sistema")
    private Set<Grupo> grupos;
    /**
     * String com pequena descrição sobre o sistema.
     */
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "description", nullable = false, length = 50)
    private String descricao;

    public String getNome() {
        return nome;
    }

    public void setNome(String id) {
        this.nome = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (nome != null ? nome.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Sistema)) {
            return false;
        }
        Sistema other = (Sistema) object;
        if ((this.nome == null && other.nome != null)
                || (this.nome != null && !this.nome.equals(other.nome))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return nome;
    }

    public boolean isUtilizarGrupoPadrao() {
        return utilizarGrupoPadrao;
    }

    public void setUtilizarGrupoPadrao(boolean useGroupDafeult) {
        this.utilizarGrupoPadrao = useGroupDafeult;
    }

    public Set<Grupo> getGrupos() {
        if (grupos == null) {
            grupos = new HashSet<Grupo>();
        }
        return grupos;
    }

    public void setGrupos(Set<Grupo> grupos) {
        this.grupos = grupos;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @Override
    public Serializable getId() {
        return this.getNome();
    }

    @Override
    public String getLabel() {
        return this.getNome();
    }

    @Override
    public int compareTo(final Sistema o) {
        return this.getLabel().compareTo(o.getLabel());
    }

    @Override
    public boolean verificarId() {
        return true;
    }
}
